package com.maikang.exammall.util;


import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class BitUtil {

    private List<List<Integer>> space;


    public BitUtil(Integer x) {
        space = new ArrayList<>();
        for (int i = 0; i < 7; i++) {
            space.add(new ArrayList<>());
        }

        for (int i = 0; i < 7; i++) {
            boolean notZero = (x & (1 << i)) != 0;
            if (notZero) {
                space.get(i).add(1);
            } else {
                space.get(i).add(0);
                space.get(i).add(1);
            }
        }
    }

    public Set<Integer> getCombinations() {
        Set<Integer> ans = new HashSet<>();
        List<Integer> choices = new ArrayList<>(7);
        for (int i = 0; i < 7; i++) {
            choices.add(0);
        }
        backtrack(choices, ans, 0);
        return ans;
    }

    private void backtrack(List<Integer> choices, Set<Integer> ans, int index) {
        if (index == 7) {
            int num = 0;
            for (int i = 6; i >=0; i--){
                num += choices.get(i) * (int) Math.pow(2, i);
            }
            ans.add(num);
            return;
        }

        List<Integer> integers = space.get(index);
        for (Integer integer : integers) {
            choices.set(index, integer);
            backtrack(choices, ans, index+1);
        }
    }
}
